#include<bits/stdc++.h>
using namespace std;
//#define int long long
const int N=1e5+10;
int n,m,L,V,dir[N],rd[N];
struct node{
    int d,v,a;
}num[N];
vector<pair<int,int>> v;
int ans;
void mk(int i,int ll,int rr){
    int id=lower_bound(dir+1,dir+m+2,ll)-dir;
    if(id!=m+1&&dir[id]<=rr){
        //cout<<i<<" "<<ll<<"->"<<rr<<endl;
        int id1=upper_bound(dir+1,dir+m+2,rr)-dir-1;
        v.push_back({id,id1});
        ans++;
    }
}
void sv1(){
    dir[m+1]=1e9+10;
    sort(dir+1,dir+m+1);
    for(int i=1;i<=n;i++){
        if(num[i].a==0){
            if(num[i].v>V){
                mk(i,num[i].d,L);
            }
            continue;
        }
        int tmp=(V*V-num[i].v*num[i].v)/(2*num[i].a);
        if(num[i].a>0){
            if(num[i].v>V){
                mk(i,num[i].d,L);
            }
            else if(tmp+num[i].d<=L){
                mk(i,num[i].d+tmp,L);
            }
        }
        else{
            if(num[i].v>V){
                mk(i,num[i].d,num[i].d+tmp);
            }
        }
    }
    cout<<ans<<" ";
}
int vis[N],vs[N],cntt;
void init(){
    ans=0,cntt=0;
    memset(dir,0,sizeof(dir));
    memset(num,0,sizeof(num));
    memset(vis,0,sizeof(vis));
    memset(vs,0,sizeof(vs));
    v.clear();
}
void solve(){
    cin>>n>>m>>L>>V;
    for(int i=1;i<=n;i++){
        cin>>num[i].d>>num[i].v>>num[i].a;
    }
    for(int i=1;i<=m;i++){
        cin>>dir[i];
    }
    sv1();
    if(ans==0){
        cout<<m<<'\n';
        return;
    }
    while(1){
        int ff=0;
        for(auto i:v){
            if(i.first==-1&&i.second==-1){
                ff++;
                continue;
            }
            vis[i.first]++,vis[i.second+1]--;
        }
        if(ff==v.size()){
            break;
        }
        for(int i=1;i<=m+1;i++){
            vis[i]+=vis[i-1];
        }
        int p=0,id=0;
        for(int i=1;i<=m;i++){
            if(vis[i]>p){
                p=vis[i],id=i;
            }
        }
        cntt++;
        for(int i=0;i<v.size();i++){
            if(v[i].first<=id&&v[i].second>=id){
                v[i].first=v[i].second=-1;
            }
        }
        memset(vis,0,sizeof(vis));
    }
    cout<<m-cntt<<'\n';
    return;
}
signed main(){
    cin.tie(0),cout.tie(0);
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T;
    cin>>T;
    while(T--){
        init();
        solve();
    }
    return 0;
}
